import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import os

try:
    import pandas as pd
    import matplotlib.pyplot as plt
    from matplotlib.font_manager import FontProperties
except ImportError:
    import sys
    import subprocess
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'pandas', 'matplotlib', 'openpyxl'])
    import pandas as pd
    import matplotlib.pyplot as plt
    from matplotlib.font_manager import FontProperties

# 读取Excel文件
try:
    df = pd.read_excel('FhjlViewDD.xlsx')
    # 打印前5行数据以确认列名和数据结构
    print('Excel文件前5行数据：')
    print(df.head())
    print('\n所有列名：')
    print(df.columns.tolist())
except FileNotFoundError:
    print("错误：未找到FhjlViewDD.xlsx文件")
    exit(1)

# 设置字体
try:
    font = FontProperties(fname='simhei.ttf', size=12)
except:
    font = FontProperties(size=12)
    print("警告：使用默认字体替代，中文显示可能不正常")

# 1. 按日统计水泥和矿粉净重并绘制柱状图
def plot_product_daily():
    # 添加日期列
    df['日期'] = pd.to_datetime(df['创建时间']).dt.date
    
    # 水泥日货运量
    cement_daily = df[df['货品'] == '水泥'].groupby('日期')['净重'].sum()
    plt.figure(figsize=(12, 6))
    cement_daily.plot(kind='bar', color='#ff7f0e')
    plt.title('水泥日货运量趋势', fontsize=14, fontproperties=font)
    plt.xlabel('日期', fontsize=12, fontproperties=font)
    plt.ylabel('货运量(吨)', fontsize=12, fontproperties=font)
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.savefig('cement_daily.png')
    plt.close()
    
    # 矿粉日货运量
    mineral_daily = df[df['货品'] == '矿粉'].groupby('日期')['净重'].sum()
    plt.figure(figsize=(12, 6))
    mineral_daily.plot(kind='bar', color='#1f77b4')
    plt.title('矿粉日货运量趋势', fontsize=14, fontproperties=font)
    plt.xlabel('日期', fontsize=12, fontproperties=font)
    plt.ylabel('货运量(吨)', fontsize=12, fontproperties=font)
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.savefig('mineral_daily.png')
    plt.close()

# 2. 按客户统计净重和并排序
def customer_demand():
    customer = df.groupby('客户')['净重'].sum().sort_values(ascending=False)
    customer.to_csv('customer_demand.csv', encoding='utf-8-sig')

# 3. 按发货地统计净重和并排序
def shipping_location():
    # 设置中文字体（关键修复）
    plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系统常用中文字体
    plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
    
    # 数据分组
    location = df.groupby('发货地')['净重'].sum().sort_values(ascending=False)
    location.to_csv('shipping_location.csv', encoding='utf-8-sig')
    
    # 绘制发货地总量柱状图（中文标题和标签）
    plt.figure(figsize=(12, 6))
    location.plot(kind='bar', color='#2ca02c')
    plt.title('发货地货运量分布', fontsize=14, fontproperties=font)
    plt.xlabel('发货地', fontsize=12, fontproperties=font)
    plt.ylabel('货运量(吨)', fontsize=12, fontproperties=font)
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.savefig('shipping_location.png')
    plt.close()
    
    # 绘制发货地分布饼状图（中文标题）
    plt.figure(figsize=(10, 10))
    location.plot(kind='pie', autopct='%1.1f%%', startangle=90, 
                 colors=['#ff9999','#66b3ff','#99ff99','#ffcc99','#c2c2f0'])
    plt.title('发货地货运量占比', fontsize=14, fontproperties=font)
    plt.ylabel('占比', fontproperties=font)  # 饼图通常不需要ylabel
    plt.tight_layout()
    plt.savefig('shipping_location_pie.png')
    plt.close()

# 4. 按车牌号统计净重和并排序
def plate_total():
    plate = df.groupby('车辆')['净重'].sum().sort_values(ascending=False)
    plate.to_csv('plate_total.csv', encoding='utf-8-sig')

# 5. 生成分析报告
def generate_report():
    with open('A公司6月份货运情况分析.md', 'w', encoding='utf-8') as f:
        f.write('# A公司6月份货运情况分析\n\n')
        f.write('## 1. 货运量总体趋势\n')
        f.write('![矿粉日趋势](mineral_daily.png)\n')
        f.write('![水泥日趋势](cement_daily.png)\n\n')
        f.write('## 2. 客户需求分析\n')
        f.write('[查看详细数据](customer_demand.csv)\n\n')
        f.write('## 3. 发货地分布\n')
        f.write('![发货地分布柱状图](shipping_location.png)\n\n')
        f.write('![发货地分布饼图](shipping_location_pie.png)\n\n')
        f.write('[查看详细数据](shipping_location.csv)\n\n')
        f.write('## 4. 运输工具分析\n')
        f.write('[查看车牌号货运量](plate_total.csv)\n\n')
        f.write('## 5. 综合分析结论\n')
        f.write('根据数据分析结果，可以得出以下结论：\n')
        f.write('- 水泥和矿粉的货运量趋势\n')
        f.write('- 主要客户需求分布\n')
        f.write('- 主要发货地分布\n')
        f.write('- 运输工具使用情况\n')

# 执行所有函数
if __name__ == '__main__':
    plot_product_daily()
    customer_demand()
    shipping_location()
    plate_total()
    generate_report()
    print("分析完成，结果已保存在当前目录下")